<?php
namespace app\common\model;

class AlipayOrders extends Model
{
    // 设置自动写入时间字段类型
    protected $autoWriteTimestamp = 'timestamp';

    protected $searchOptions = [
        'trade_no'       => ['='],// 支付宝订单号
        'remark'         => ['like', '%%%s%%'],// 备注消息
        'buyer_id'       => ['='],// 买家支付宝用户号
        'buyer_logon_id' => ['='],// 买家支付宝账号
        'phone'          => ['='],// 手机号
        'ip'             => ['='],// 消费者IP
        'status'         => ['='],// 状态
        'refund_status'  => ['='],// 退款状态
        'create_time'    => ['timestamp'],// 创建时间
    ];

    // 状态列表
    const status_datalist = [
        0 => '未支付',
        1 => '已支付',
        2 => '已关闭',
    ];

    // 退款状态列表
    const refund_status_datalist = [
        0 => '否',
        1 => '是',
    ];

    /**
     * 根据订单号查找订单
     * @param $out_trade_no
     * @return array|\think\Model|null
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function findOutTradeNo($out_trade_no)
    {
        if (strlen($out_trade_no) > 20) {
            return self::where('trade_no', $out_trade_no)->find();
        } else {
            $id = explode('-', $out_trade_no, 2)[1] ?? null;
            $orders = self::where('id', $id)->find();

            if (null === $orders || $orders['out_trade_no'] != $out_trade_no) {
                return null;
            } else {
                return $orders;
            }
        }
    }

    /**
     * 检查订单是否已支付
     * @param string|int $out_trade_no 订单号
     * @return int 0 订单不存在,1 已支付,2 未支付,3 已过期
     */
    static public function existsPay($out_trade_no): int
    {
        if (preg_match('/^1[3-9]\d{9}$/', $out_trade_no)) {
            $info = self::where('phone', $out_trade_no)->find();
        } elseif (strlen($out_trade_no) > 20) {
            $info = self::where('trade_no', $out_trade_no)->find();
        } elseif (strpos($out_trade_no, '-') > 0) {
            $ip = explode('-', $out_trade_no, 2);
            $info = self::where('id', $ip[1])->find();
        } else {
            $info = self::where('id', $out_trade_no)->find();
        }

        if (null === $info) {
            return 0;
        } elseif (isset($ip) && $info['out_trade_no'] != $out_trade_no) {
            return 0;
        } elseif (1 != $info['status']) {
            return 2;
        } elseif (strtotime($info['create_time']) + 86400 * 7 < time()) {
            return 3;
        } else {
            return 1;
        }
    }

    /**
     * 获取商家订单号
     * @param null $value
     * @param array $data
     * @return string
     */
    public function getOutTradeNoAttr($value, $data)
    {
        if (preg_match_all('@\d@', $data['ip'], $matches)) {
            $matches = sprintf('%010d', substr(implode('', $matches[0]), 0, 10));
        } else {
            $matches = strtotime($data['create_time']);
        }

        return $matches . '-' . $data['id'];
    }
}